package com.sxj.corejava.code07_面向对象.多态与常量;

/**
 * @author 石小俊
 * 2024年07月16日 10:16
 */
public class Test01_多态基本用法 {
    public static void main(String[] args) {
        // 对象的多态性,表示父类的引用指向了子类的对象
        // 此时编译时类型是父类Person
        // 运行时类型是子类Man
        Person person = new WoMan();
        // 当执行show方法时,最终运行的是子类的方法
        //person.show();

        // 由于此时编译时类型是父类Person
        // 而在Person中没有work方法
        // 因此,此时编译时报错
        // person.work();

        // 想要执行work方法,必须通过子类Man进行调用
        // 那么可以先将person强制转换成Man,然后进行调用
        //Man man = (Man) person;
        //man.work();
        //((Man)person).work();

        // 在进行强制类型转换时,如果转换前的父类引用指向的不是转换后的子类对象时
        // 运行会报错,ClassCastException

        // 引用数据类型之间的转换
        // 1.自动类型转换
        // 当子类对象转换成父类的时候,将会自动转换
        // 2.强制类型转换
        // 将一个指向子类对象的父类引用转换成子类对象
        // 如果转换后的对象与父类引用的对象不是同一个,则无法转换,会报错
        // 因此,我们可以在转换前做一个判断
        // 判断是否可以转换,如果可以,则使用强制类型转换
        // 判断语法:父类引用的对象 instanceof 转换后的类型
        if (person instanceof Man) {
            Man man = (Man) person;
            man.work();
        } else if (person instanceof WoMan) {
            WoMan woMan = (WoMan) person;
            woMan.shopping();
        } else {
            System.out.println("错误:对不起,当前父类引用的对象不是该子类,无法转换!");
        }


    }
}

class Person {

    private String name;
    private int age;

    public void show() {
        System.out.println("这是一个人");
    }

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

class Man extends Person {
    private double salary;

    public void show() {
        System.out.println("这是一个男人");
    }

    public void work() {
        System.out.println("我是一个男人,需要赚钱养家");
    }

    public Man() {
    }

    public Man(String name, int age, double salary) {
        super(name, age);
        this.salary = salary;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}

class WoMan extends Person {
    private int appearance;

    public void show() {
        System.out.println("这是一个女人");
    }

    public void shopping() {
        System.out.println("我是一个女人,只需要负责貌美如花,没事逛街购物");
    }

    public WoMan(String name, int age, int appearance) {
        super(name, age);
        this.appearance = appearance;
    }

    public WoMan() {
    }

    public int getAppearance() {
        return appearance;
    }

    public void setAppearance(int appearance) {
        this.appearance = appearance;
    }
}